<?php

namespace backend\models;

use Yii;
use yii\db\Exception;
use yii\web\UploadedFile;

class Course extends \common\models\Course
{
    public $filePath;
    public $uploadFile;
    public $oldFile;

    public function rules()
    {
        return array_merge([
            [['KCMC' ], 'match', 'pattern' => '/^[\u4e00-\u9fa5a-zA-Z0-9]+$/','message' => '该项填写内容包含非法字符'],  // 代号类字段
            [['KCDM' ], 'match', 'pattern' => '/^[a-zA-Z0-9]+$/','message' => '该项填写内容包含非法字符'],  // 代号类字段
            //[['KCJJ', 'JC'], 'match', 'pattern' => '/^[a-zA-Z0-9]+$/','message' => '该项填写内容包含非法字符'],  // 代号类字段
            [['ZXS', 'LLXS', 'SYXS', 'SJXS'], 'integer','message' => '该项填写内容应为纯数字'],  // 纯数字类字段
            [['XF'],'number','message' => '该项内容必须为实数'],
            [['JXDG'], 'file', 'extensions'=>'pdf', 'maxSize' => 1024*1024, /*'skipOnEmpty' => false*/],  //只支持1M以内的pdf文件
            [['uploadFile'], 'file', 'extensions'=>'pdf', 'maxSize' => 1024*1024, /*'skipOnEmpty' => false*/],  //只支持1M以内的pdf文件
            [['CJSJ','GXSJ'], 'date', 'format' => 'php:Y-m-d', 'message' => '错误的日期格式，请重新修改','on'=>'insert'],
            [['CJSJ','GXSJ'], 'date', 'format' => 'php:Y-m-d H:i:s', 'message' => '错误的日期格式，请重新修改','on'=>'update'],
        ], parent::rules());
    }


    /**
     *载入提交数据时提交上传，不要直接存放到目标位置，要考虑到load成功后，万一save前其他字段验证失败导致没修改记录，原来的文件却被覆盖了
     * @param array $data
     * @param null $formName
     * @return bool
     */
    public function load($data, $formName = null)
    {
        $this->uploadFile = UploadedFile::getInstance($this, 'JXDG');
        return  parent::load($data, $formName);
    }

    public function save($runValidation = true, $attributeNames = null)
    {
        //存储路径: upload/JXDG/年份****/学校ID/目录下
        $fileDir = 'upload/JXDG/'.substr(Date('Y'),0,4).'/'.$this->XXID;
        $this->filePath = $fileDir.'/'.$this->uploadFile->baseName.".".$this->uploadFile->extension;

        if (!file_exists($fileDir)) mkdir($fileDir , 0777, true);

        $this->JXDG = $this->filePath;

        if(! parent::save($runValidation, $attributeNames)) {
            return false;
        }

        if(!$this->uploadFile->saveAs($this->filePath)){
            throw new Exception("上传文件失败".$this->uploadFile);
        }
        return  true;
    }

    //删除数据前先保存原文件到临时目录
    public function beforeDelete()
    {
        if (!parent::beforeDelete()) {
            return false;
        }

        $file=$this->JXDG;
        $tmpDir = 'upload/JXDG/tmp/'.substr(Date('Y'),0,4).'/'.$this->XXID;
        $destFile=$tmpDir.'/'.basename($file);
        if (!file_exists($tmpDir)) mkdir($tmpDir , 0777, true); //不存在则新建临时目录

        if (file_exists($file)) {  //拷贝到临时目录
            copy($file,$destFile);
        }
        return true;
    }


    /**
     * 删除记录之后再删除文件，防止外键约束删除记录失败，文件却删掉了
     */
    public function afterDelete()
    {
        parent::afterDelete(); // TODO: Change the autogenerated stub  $filePath

        $file=$this->JXDG;
        $tmpDir = 'upload/JXDG/tmp/'.substr(Date('Y'),0,4).'/'.$this->XXID;

        if (file_exists($file)) {  //拷贝到临时目录
            unset($this->JXDG);
            unlink($file); //删除旧目录下的文件
            unlink($tmpDir.'/'.basename($file)); //删除临时目录下的文件
        }
    }

    //修改大纲前做好备份，备份到临时目录
    public function beforeSave($insert)
    {
        if(!parent::beforeSave($insert)){
            return false;
        }

        if(!$insert){  //只处理修改操作
            $model=CourseSearch::findOne($this->ID); //找到修改前的数据
            $this->oldFile=$model->JXDG;

            $tmpDir = 'upload/JXDG/tmp/'.substr(Date('Y'),0,4).'/'.$this->XXID;
            $destFile=$tmpDir.'/'.basename($this->oldFile);
            if (!file_exists($tmpDir)) mkdir($tmpDir , 0777, true); //不存在则新建临时目录

            if (file_exists($this->oldFile)) {  //拷贝到临时目录
                copy($this->oldFile,$destFile);
            }
        }

        return true;
    }

    //修改完大纲之后把临时文件和以前的文件删除
    public function afterSave($insert, $changedAttributes)
    {
        parent::afterSave($insert, $changedAttributes); // TODO: Change the autogenerated stub

        if(!$insert){
            $tmpDir = 'upload/JXDG/tmp/'.substr(Date('Y'),0,4).'/'.$this->XXID;

            if (file_exists($this->oldFile)) {  //拷贝到临时目录
                unlink($this->oldFile); //删除旧目录下的文件
                unlink($tmpDir.'/'.basename($this->oldFile)); //删除临时目录下的文件
            }
        }

    }

}